#include <iostream>

class Base
{
public:
    virtual void show()
    {
        std::cout << "Base" << std::endl;
    }
};

class Derived : public Base
{
public:
    virtual void show()
    {
        std::cout << "Derived" << std::endl;
    }
};

int main()
{
    // 静态转换
    // int a = 0;
    // double b = static_cast<double>(a); // 支持基础数据类型转换
    // std::cout << b << std::endl;

    // int a = 10;
    // int *p = &a;
    // // char *c = static_cast<char*>(p);  // 不同类型的指针不允许转换
    // void *c = static_cast<void *>(p); // 支持void * 和其他类型指针的相互转换
        // 可以用于父子类之间的转换，但是不会安全检查

    // 动态转换
    // 用于父子类之间的转换
    // 会进行安全检查
    // 当向下转型不安全时，会返回空指针
    // 如果没有虚函数，向下转型直接编译失败
    // Base *b = new Derived;
    // Derived *d = dynamic_cast<Derived*>(b);  // 向下转型
    // if(d == nullptr)
    // {
    //     std::cout<<"空指针"<<std::endl;
    // }
    // d->show();

    // 常量转换
    const int a = 20;
    int *b = const_cast<int*>(&a);  // 将a的常量指针转换为非常量指针b
    *b = 30;
    std::cout<<a<<std::endl;  // a的值不会变，因为const在符号表中

    // 重解释转换
    // 相当于强制类型转换:想转就转，安全性不高，不要用
    // int a = 20;
    // double *b = reinterpret_cast<double*>(a);

    return 0;
}
